package com.wei.czz.framework.admin.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.admin.DeptUserFlowDto;
import com.wei.czz.common.enums.admin.deptUser.DeptUserMoveModeEnum;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.admin.DeptUserFlowVo;
import com.wei.czz.common.vo.admin.deptUser.DeptUserJoinVo;
import com.wei.czz.framework.admin.manager.UserManager;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-09-21 23:10:02
 * className: DeptUserFlowController 用户切换部门操作请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("sys/dept-user/flow")
@AllArgsConstructor
public class DeptUserFlowController {

    private static final Logger log = LoggerFactory.getLogger(DeptUserFlowController.class);

    private final BatchProperty batchProperty;

    private final UserManager userManager;

    /**
     * 单个用户切换部门接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-用户切换部门弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param deptUserFlowVo 用户切换部门参数对象
     * @return 不返回数据
     */
    @Resubmit(message = "用户切换部门")
    @PostMapping("/one/move")
    @Auth(permit = "user:move:opt")
    public Result<Object> oneUserMove(@Validated(Save.class) @RequestBody DeptUserFlowVo deptUserFlowVo) {
        log.info("开始单个用户切换部门业务。{}", deptUserFlowVo);

        if (!DeptUserMoveModeEnum.ONE.getValue().equals(deptUserFlowVo.getMoveMode())) {
            log.info("切换模式参数错误");
            return Result.paramFail();
        }
        if (deptUserFlowVo.getUserIds().size() > 1) {
            log.info("切换用户数量超限");
            return Result.clientFail("一次只能切换一个用户");
        }

        userManager.oneUserMove(deptUserFlowVo);

        log.info("单个用户切换部门业务结束");
        return Result.success();
    }

    /**
     * 批量用户切换部门接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-批量用户切换部门弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param deptUserFlowVo 用户切换部门参数对象
     * @return 不返回数据
     */
    @Resubmit(spEL = "'batchUserMove' + #userPo.userId", message = "批量用户切换部门")
    @PostMapping("/batch/move")
    @Auth(permit = "user:move:opt")
    public Result<Object> batchUserMove(@Validated(Save.class) @RequestBody DeptUserFlowVo deptUserFlowVo) {
        log.info("开始批量用户切换部门业务。{}", deptUserFlowVo);

        if (!DeptUserMoveModeEnum.BATCH.getValue().equals(deptUserFlowVo.getMoveMode())) {
            log.info("批量用户切换部门接口，切换模式参数错误");
            return Result.paramFail();
        }
        List<Long> userIdList = deptUserFlowVo.getUserIds();
        if (batchProperty.getMaxSize() < userIdList.size()) {
            log.warn("切换用户所属部门数量超限。batch.maxSize={} list.size={}", batchProperty.getMaxSize(), userIdList.size());
            return Result.clientFail("一次批量切换用户所属部门最多允许同时切换" + batchProperty.getMaxSize() + "个用户");
        }

        userManager.batchUserMove(deptUserFlowVo);

        log.info("批量用户切换部门业务结束");
        return Result.success();
    }

    /**
     * 部门用户集体切换部门接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-用户切换部门弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param deptUserFlowVo 用户切换部门参数对象
     * @return 不返回数据
     */
    @Resubmit(message = "部门用户集体切换部门")
    @PostMapping("/all/move")
    @Auth(permit = "user:move:all")
    public Result<Object> allUserMove(@Validated(Update.class) @RequestBody DeptUserFlowVo deptUserFlowVo) {
        log.info("开始部门用户集体切换部门业务。{}", deptUserFlowVo);

        if (!DeptUserMoveModeEnum.ALL.getValue().equals(deptUserFlowVo.getMoveMode())) {
            log.info("部门用户集体切换部门接口，切换模式参数错误");
            return Result.paramFail();
        }

        userManager.allUserMove(deptUserFlowVo);

        log.info("部门用户集体切换部门业务结束");
        return Result.success();
    }

    /**
     * 用户加入部门接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-用户加入部门弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param deptUserJoinVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'user-join-dept' + #deptUserJoinVo.userId", message = "")
    @PostMapping("/join")
    @Auth(permit = "user:move:opt")
    public Result<Object> joinDept(@Validated @RequestBody DeptUserJoinVo deptUserJoinVo) {
        log.info("开始用户加入部门业务。{}", deptUserJoinVo);

        userManager.joinDept(deptUserJoinVo);

        log.info("用户加入部门业务结束");
        return Result.success();
    }

    /**
     * 分页查询用户切换部门流水接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-用户切换部门记录弹出框中调用
     * @param userId 用户主键
     * @param page   页码
     * @param limit  每页大小
     * @return 用户切换部门流水分页数据
     */
    @GetMapping("/page/list")
    @Auth(permit = "user:move:opt")
    public Result<Object> getPageUserDeptFlowList(@RequestParam("userId") Long userId,
                                                  @RequestParam("page") Integer page,
                                                  @RequestParam("limit") Integer limit) {
        log.info("开始分页查询用户切换部门记录业务。userId={} page={} limit={}", userId, page, limit);

        PageDto<DeptUserFlowDto> pageDto = userManager.getUserDeptFlowPageList(userId, page, limit);

        log.info("分页查询用户切换部门记录业务结束");
        return Result.success(pageDto);
    }
}
